package com.bms.client.service.impl;

import com.bms.client.pojo.XiangMu;
import com.bms.client.mapper.XiangMuMapper;
import com.bms.client.utils.RedisUtils;
import org.apache.ibatis.annotations.Param;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service;
import com.bms.client.service.XiangMuService;
import javax.annotation.Resource;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;

/**
 * (XiangMu)表服务实现类
 *
 * @author k-3101
 * @since 2021-03-15 19:14:31
 * @version 1.0
 */
@Service("xiangMuService")
public class XiangMuServiceImpl implements XiangMuService {
    @Resource
    private XiangMuMapper xiangMuMapper;
    @Resource
    private RedisTemplate redisTemplate;
    @Resource
    private RedisUtils redisUtils;

    /**
     * 根据模糊条件查询总个数
     *
     * @return 返回查询到的总个数
     */
	@Override
    public Map<String, Object> chaXunCount(String xiangMuMing,String zhiXingZhuangTai, String zhiXingRen, String faBuRen, String faBuShiJianQiShi, String faBuShiJianJieShu, String wanChengShiJian) {
        Map<String, Object> map = new HashMap<>();
        // 前端端分离时，前端人员会首先判断code值是否满足200，如果不是200，则提醒用户失败
        map.put("code", 200);
        map.put("msg", "查询成功");
        map.put("list", this.xiangMuMapper.chaXunCount(xiangMuMing, zhiXingZhuangTai, zhiXingRen,  faBuRen,faBuShiJianQiShi,faBuShiJianJieShu, wanChengShiJian));
        return map;
    }

    /**
     * 查询所有数据
     * @return  返回所有数据
     */
	@Override
    public Map<String, Object> chaXunAll() {
        Map<String, Object> map = new HashMap<>();
        // 前端端分离时，前端人员会首先判断code值是否满足200，如果不是200，则提醒用户失败
        map.put("code", 200);
        map.put("msg", "查询成功");
        map.put("list", this.xiangMuMapper.chaXunAll());
        return map;
    }

    /**
     * 通过ID查询单条数据
     *
     * @param id 主键
     * @return 实例对象
     */
	@Override
    public Map<String, Object> chaXunById(Integer id) {
        Map<String, Object> map = new HashMap<>();
        // 前端端分离时，前端人员会首先判断code值是否满足200，如果不是200，则提醒用户失败
        map.put("code", 200);
        map.put("msg", "查询成功");
        map.put("obj", this.xiangMuMapper.chaXunById(id));
        return map;
    }

    /**
     * 查询分页数据
     *
     * @param page 查询起始位置
     * @param xiangMuMing 查询条数
     * @return 对象列表
     */
	@Override
    public Map<String, Object> chaXunFenYe(int page,String xiangMuMing,String zhiXingZhuangTai, String zhiXingRen, String faBuRen, String faBuShiJianQiShi, String faBuShiJianJieShu, String wanChengShiJian) {
    // 获取当前表中的总记录
        int tableCount = this.xiangMuMapper.chaXunCount(xiangMuMing, zhiXingZhuangTai, zhiXingRen,  faBuRen, faBuShiJianQiShi,faBuShiJianJieShu, wanChengShiJian);
        // 总页码计算   (总条数 - 1) / 每页显示条数  + 1
        // (100 - 1) / 10 + 1 = 10        (101 - 1) / 10 + 1 = 11      (99 - 1) / 10 + 1 = 10
        int pageCount = (tableCount - 1) / 10 + 1;
        // 计算每页开始的下标值
        int xiaBiao = (page - 1) * 10;
        Map<String, Object> map = new HashMap<>();
        map.put("code", 0);   // 前端端分离时，前端人员会首先判断code值是否满足200，如果不是200，则提醒用户失败
        map.put("msg", "查询成功");
        map.put("pageCount", pageCount);  // 查询的记录总页码
        map.put("count", tableCount);     // 当前表中的总条数
        map.put("data", this.xiangMuMapper.chaXunFenYe(xiaBiao, xiangMuMing, zhiXingZhuangTai, zhiXingRen,  faBuRen, faBuShiJianQiShi,faBuShiJianJieShu, wanChengShiJian));
        return map;
    }

    /**
     * 新增数据
     *
     * @param xiangMu 实例对象
     * @return 实例对象
     */
	@Override
    public Map<String, Object> xinZeng(XiangMu xiangMu) {
        // UUID.randomUUID()  返回内容：asd21321-ewrewrew213213-123213zsad-123asdasd这样的形态
        xiangMu.setFaBuShiJian(new Date(System.currentTimeMillis()));
        xiangMu.setWanChengShiJian(new Date(System.currentTimeMillis()));
        this.xiangMuMapper.xinZeng(xiangMu);

//        redis(Integer.parseInt(xiangMu.getId()),0);

        Map<String, Object> map = new HashMap<>();
        map.put("code", 200);   // 前端端分离时，前端人员会首先判断code值是否满足200，如果不是200，则提醒用户失败
        map.put("msg", "新增成功");
        return map;
    }

    /**
     * 通过ID查询单条数据
     *
     * @param xiangMu 实例对象
     * @return 实例对象
     */
	@Override
    public Map<String, Object> gengXinById(XiangMu xiangMu) {
        this.xiangMuMapper.gengXinById(xiangMu);

//        redis(Integer.parseInt(xiangMu.getId()),1);

        Map<String, Object> map = new HashMap<>();
        map.put("code", 200);   // 前端端分离时，前端人员会首先判断code值是否满足200，如果不是200，则提醒用户失败
        map.put("msg", "更新成功");
        return map;
    }

    /**
     * 通过主键删除数据
     *
     * @param id 主键
     * @return 是否成功
     */
	@Override
    public Map<String, Object> shanChuById(String id) {
        this.xiangMuMapper.shanChuById(id);
        Map<String, Object> map = new HashMap<>();

        if(!redisUtils.redisDelete("xiangMu",id)){
            map.put("code", 200);   // 前端端分离时，前端人员会首先判断code值是否满足200，如果不是200，则提醒用户失败
            map.put("msg", "重复删除");
        }

        map.put("code", 200);   // 前端端分离时，前端人员会首先判断code值是否满足200，如果不是200，则提醒用户失败
        map.put("msg", "删除成功");
        return map;
    }
    private void redis(int id,int stat){
        Map<String,String> map=new HashMap<>();
        XiangMu xiangMu = (XiangMu)chaXunById(id).get("obj");
        if(xiangMu!=null){
            map.put("xiangMuMing",xiangMu.getXiangMuMing());
            map.put("zhiXingZhuangTai",xiangMu.getZhiXingZhuangTai());
            map.put("zhiXingRen",xiangMu.getZhiXingRen());
            map.put("faBuRen",xiangMu.getFaBuRen());
            if(stat==0)
            {
                redisUtils.redisInsert("xiangMu",map,String.valueOf(id),xiangMu);
            }
            if(stat==1){
                redisUtils.redisUpData("xiangMu",map,String.valueOf(id),xiangMu);
            }
        }
    }
}